package com.hspedu.single_;

/**
 * @Author Stringzhua
 * @Date 2024/3/5 19:47
 * description:单例模式-->[懒汉式]
 * 只有当用户使用getInstance时,才返回一个Cat对象
 * 后面再次调用时,会返回上次创建的Cat对象
 * 从而保证了单例模式
 *
 * 优点:
 * 在使用时才创建对象
 * 不存在资源浪费
 * 缺点:多个线程时存在线程安全问题
 * 步骤:
 * 1.仍然将构造器私有化
 * 2.定义一个static属性
 * 3.提供一个public的static方法,可以返回一个Cat对象
 */
public class SingleTon02 {
    public static void main(String[] args) {
//        new Cat("大黄");
//        System.out.println("Cat.n1 = " + Cat.n1);
        Cat instance = Cat.getInstance();
        System.out.println(instance);

        //再次调用getInstance
        Cat instance1 = Cat.getInstance();
        System.out.println(instance1);

        System.out.println(instance == instance1);//true
    }
}

//希望在程序运行过程中,只能创建一个Cat对象
//使用单例模式
class Cat {
    private String name;
    public static int n1 = 999;
    private static Cat cat;//定义static属性 属性默认是null
    /*
     * 步骤:
     * 1.仍然将构造器私有化
     * 2.定义一个static属性
     * 3.提供一个public的static方法,可以返回一个Cat对象
     * */

    private Cat(String name) {
        System.out.println("构造器调用~");
        this.name = name;
    }

    public static Cat getInstance() {
        if (cat == null) {
            //如果还没有创建cat对象
            cat = new Cat("爪爪");
        }
        return cat;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                '}';
    }
}
